package tetris_invader.itens;

import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.io.Serializable;
import tetris_invader.personagens.Nave;
import tetris_invader.util.Fase;

public abstract class Item implements Serializable {

    protected Point posicao;
    protected Image imagens[];
    protected Fase fase;
    private int i;
    private int incremento;
    private int itemDelay;

    /** @brief Classe abstrata Item: E a base das pecas do jogo
     *      
     */
    public Item() {
    }

    public Item(Fase fase, Image imagens[]) {
        this.fase = fase;
        this.imagens = imagens;
        i = 0;
        incremento = 1;
        itemDelay = 0;
    }

    public Point getposicao() {
        return this.posicao;
    }

    public void setposicao(Point posicao) {
        this.posicao = posicao;
    }

    /**
     * Verifica se o desenho esta fora dos limites da tela
     * @return true se estiver fora da tela; falso caso contrario
     */
    public boolean offLimits() {
        Dimension aux = fase.getSize();

        if (posicao.x < -50 || posicao.y < -50 || posicao.x > aux.width + 50) {
            return true;
        }
        return false;
    }

    /**
     * Desenha: forca a classe a ter metodos para desenhar
     * @param g2
     */
    public void desenha(Graphics2D g2) {

        g2.drawImage(this.imagens[i], posicao.x, posicao.y, fase);

        if (imagens.length > 1) {
            i += incremento;
            if (i == 0 || i == imagens.length - 1) {
                incremento = -incremento;
            }
        }
    }

    public abstract void deslocamento();

    public boolean colisao(Object o) {
        if (o instanceof Nave) {
            Nave n = (Nave) o;

            return n.positionError(this.posicao);
        }
        return false;
    }


    /**
     * Contagem do tempo de permanencia do item na tela
     * @return true se o o tempo do item se esgotou.
     */
    public boolean itemDelay() {
        if (itemDelay >= 70) {
            itemDelay = 0;
            return true;
        } else {
            itemDelay++;
        }
        return false;
    }
}
